/*
 * $Id: Article.java 46 2012-02-17 12:50:01Z rook.alex@gmail.com $
 */
package ua.org.energy.vkek.site.model;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;
import java.io.Serializable;
import java.util.Date;
import java.util.Stack;
import javax.persistence.*;
import ua.org.energy.vkek.site.server.DataIOException;

@NamedQueries({
    @NamedQuery(name = "Article.findAll",
    query = "SELECT c from Article c"),
    @NamedQuery(name = "Article.findByTitle",
    query = "SELECT obj from Article obj WHERE obj.articleTitle=:artTitle"),
    @NamedQuery(name = "Article.findCount",
    query = "SELECT count(c) from Article c"),})
@Entity
public class Article extends AbstractEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key ident;
    private String articleTitle;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date articleDate; //date publications/edit
    @ManyToOne(optional = false)
    private ArticleTag tag;
    @Basic(fetch= FetchType.LAZY) //TODO: без Basic не работают тесты с ошибкой out of field index : 4 - разобраться почему
    private Text content;  //xhtml content of article

    /**
     * @return the articleTitle
     */
    public String getArticleTitle() {
        return articleTitle;
    }

    /**
     * устанавливает заговок статьи который не может быть пустым или null если
     * содержимое уже установленно и производится попытка присвоить ему null, то
     * генерируется исключение
     *
     * @param articleTitle the articleTitle to set
     */
    public void setArticleTitle(String articleTitle) throws DataIOException {
        this.articleTitle = setFieldWise(this.articleTitle, articleTitle, true, new String[]{"", "undefined"});
    }

    /**
     * @return the articleDate
     */
    public Date getArticleDate() {
        return articleDate;
    }

    /**
     * @param articleDate the articleDate to set
     */
    public void setArticleDate(Date articleDate) {
        this.articleDate = articleDate;
    }

    /**
     * @return the ident
     */
    public Key getIdent() {
        return ident;
    }

    /**
     * @param ident the ident to set
     */
    public void setIdent(Key ident) {
        this.ident = ident;
    }

    /**
     * @return the tag
     */
    public ArticleTag getTag() {
        return tag;
    }

    /**
     * @param tag the tag to set
     */
    public void setTag(ArticleTag tag) {
        this.tag = tag;
    }

    /**
     * @return the content
     */
    public Text getContent() {
        return content;
    }

    /**
     * устанавливает содержимое статьи которое может быть пустым или null если
     * содержимое уже установленно и производится попытка присвоить ему null, то
     * попытка игнорируется и поле остается прежним
     *
     * @param content the content to set
     */
    public void setContent(Text content) throws DataIOException {
        this.content = setFieldWise(this.content, content, false, new Text[]{new Text("undefined")});
    }

    @Override
    public Article webSafeClone() {
        Article buf = new Article();
        try {
            buf.setIdent(getIdent());
            buf.setArticleTitle(articleTitle);
            buf.setArticleDate(articleDate);
            buf.setContent(content);
        } finally {
            return buf;
        }
    }

    @Override
    public Stack<EntityPathElement> getEntityPath() {
        Stack<EntityPathElement> result;
        if (this.getTag() != null) {
            result = getTag().getEntityPath();
        } else {
            result = new Stack<EntityPathElement>();
        }
        result.push(getPathElement());
        return result;
    }

    @Override
    public EntityPathElement getPathElement() {
        return new EntityPathElementImpl(articleTitle, ident);
    }
    
    @Override
    public String toString(){
        return getClass().getName()+",Key:"+
                getIdent().toString()+",ArticleTitle:"+getArticleTitle();
    }
}
